// const _ = require('lodash')
const { log } = console
const reverse = (arr) => arr.reverse()
const first = (arr) => arr[0]
const toUpper = (s) => s.toUpperCase()

const f = flowRight(toUpper, first, reverse)
// k可以接受多个参数 (原来只能两个)
log(f(['one', 'two', 'three'])) //THREE

// ...args就是纯函数们
// reduce依次执行一个函数 并把结果汇总到一起
// reduce() 方法接收一个函数作为累加器，数组中的每个值（从左到右）开始缩减，最终计算为一个值。
// reduce把数组所有方法汇总执行
function flowRight(...args) {
  return function (value) {
    // acc是汇总的结果
    // fn就是数组的函数 fn(acc)就是处理之后的结果，后面函数会调用前面函数的返回值
    return args.reverse().reduce(function (acc, fn) {
      return fn(acc)
      // reduce的第二个参数就是函数的初始值！也就是第一次传递进来的value
    }, value)
  }
}

// 简化return
// 数组中的最后一个元素获取到并大写
const flowRight = (...args) => (val) =>
  args.reverse().reduce((acc, fn) => fn(acc), val)
